home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / gfx / misc / gnuplot-src.lha / gnuplot-3.7.1src / gnuplot-3.7.1.lha / gnuplot-3.7.1 / term / gnugraph.trm < prev    next >
Encoding:
Text File  |  1999-08-19  |  8.8 KB  |  335 lines

  1. /*
  2.  * $Id: gnugraph.trm,v 1.8.2.1 1999/08/19 14:17:45 lhecking Exp $
  3.  */
  4.  
  5. /* GNUPLOT -- gnugraph.trm */
  6.  
  7. /*[
  8.  * Copyright 1993, 1998
  9.  *
  10.  * Permission to use, copy, and distribute this software and its
  11.  * documentation for any purpose with or without fee is hereby granted,
  12.  * provided that the above copyright notice appear in all copies and
  13.  * that both that copyright notice and this permission notice appear
  14.  * in supporting documentation.
  15.  *
  16.  * Permission to modify the software is granted, but not the right to
  17.  * distribute the complete modified source code.  Modifications are to
  18.  * be distributed as patches to the released version.  Permission to
  19.  * distribute binaries produced by compiling modified sources is granted,
  20.  * provided you
  21.  *   1. distribute the corresponding source modifications from the
  22.  *    released version in the form of a patch file along with the binaries,
  23.  *   2. add special version identification to distinguish your version
  24.  *    in addition to the base release version number,
  25.  *   3. provide your name and address as the primary contact for the
  26.  *    support of your modified version, and
  27.  *   4. retain our contact information in regard to use of the base
  28.  *    software.
  29.  * Permission to distribute the released version of the source code along
  30.  * with corresponding source modifications in the form of a patch file is
  31.  * granted with same provisions 2 through 4 for binary distributions.
  32.  *
  33.  * This software is provided "as is" without express or implied warranty
  34.  * to the extent permitted by applicable law.
  35. ]*/
  36.  
  37. /*
  38.  * This file is included by ../term.c.
  39.  *
  40.  * This terminal driver supports:
  41.  *  GNU plot(5) graphics language
  42.  *
  43.  * AUTHORS
  44.  *  Tony Richardson from the unixplot.trm by Colin Kelley, Thomas Williams,
  45.  *  and Russell Lang and from post.trm by Russell Lang.
  46.  * 
  47.  * send your comments or suggestions to (info-gnuplot@ames.arc.nasa.gov).
  48.  */
  49.  
  50. /*
  51.  * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
  52.  */
  53.  
  54. /*
  55.  * This version of the 'unixplot' driver produces device independent
  56.  * output.  I've chosen parameter values so that the PostScript output
  57.  * produced by plot2ps is 5" x 3".  You can use the 'set size' command
  58.  * to get output up to 8.25" x 8.25", i.e. size values larger than
  59.  * 1 are okay.
  60.  */
  61.  
  62. /*
  63. Unixplot library writes to stdout.  A fix was put in place by
  64. ..!arizona!naucse!jdc to let set term and set output redirect
  65. stdout.  All other terminals write to gpoutfile.
  66. */
  67.  
  68. /* This is a device independent format, so the output should look
  69.  * look "reasonable" on any output device.  I set things up there so
  70.  * that the output of plot2ps is 5" x 3" (standard GNUPLOT size).
  71.  * You can use GNUPLOT's size command to obtain plots to almost the
  72.  * 8.25" x 8.25" limit.
  73.  */
  74.  
  75. #include "driver.h"
  76.  
  77. #if defined (HAVE_PLOTCOMPAT_H)
  78. # include <plotcompat.h>
  79. #endif
  80.  
  81. #ifdef TERM_REGISTER
  82. register_term(unixplot)
  83. #endif
  84.  
  85. #ifdef TERM_PROTO
  86. TERM_PUBLIC void UP_options __PROTO((void));
  87. TERM_PUBLIC void UP_init __PROTO((void));
  88. TERM_PUBLIC void UP_graphics __PROTO((void));
  89. TERM_PUBLIC void UP_text __PROTO((void));
  90. TERM_PUBLIC void UP_linetype __PROTO((int linetype));
  91. TERM_PUBLIC void UP_move __PROTO((unsigned int x, unsigned int y));
  92. TERM_PUBLIC void UP_vector __PROTO((unsigned int x, unsigned int y));
  93. TERM_PUBLIC void UP_put_text __PROTO((unsigned int x, unsigned int y, char str[]));
  94. TERM_PUBLIC int UP_text_angle __PROTO((int ang));
  95. TERM_PUBLIC int UP_justify_text __PROTO((enum JUSTIFY mode));
  96. TERM_PUBLIC void UP_reset __PROTO((void));
  97. #define UP_XMAX 19859
  98. #define UP_YMAX 11565
  99. /* UP_VCHAR = ((UP_FONTSIZE*UP_YMAX)/(UP_YINCHES*72)) 
  100.             = UP_FONTSIZE*UP_VFONTSC
  101.    UP_HCHAR = ((UP_FONTSIZE/2)*UP_XMAX)/(UP_XINCHES*72))
  102.             = UP_FONTSIZE*UP_HFONTSC
  103. */
  104.  
  105. #define UP_VFONTSC  53.5
  106. #define UP_VCHAR    535        /* 10 * VFONTSC */
  107. #define UP_HFONTSC  27.6
  108. #define UP_HCHAR    276        /* 10 * HFONTSC */
  109.  
  110. #define UP_VTIC (UP_YMAX/80)
  111. #define UP_HTIC (UP_XMAX/80)
  112. #endif /* TERM_PROTO */
  113.  
  114. #ifndef TERM_PROTO_ONLY
  115. #ifdef TERM_BODY
  116.  
  117.  
  118. char up_font[MAX_ID_LEN+1] = "Courier";    /* name of font */
  119. int up_fontsize = 10;
  120.  
  121. /* plot2ps produces a 8.25" x 8.25" square. */
  122. #define UP_SCREENX 32768
  123. #define UP_SCREENY 32768
  124. #define UP_SCRXINC 8.25
  125. #define UP_SCRYINC 8.25
  126.  
  127. /* We want a 5" x 3" graph by default. */
  128. #define UP_XINCHES 5
  129. #define UP_YINCHES 3
  130. /* UP_XMAX = (UP_SCREENX*UP_XINCHES)/UP_SCRXINC
  131.    UP_YMAX (UP_SCREENY*UP_YINCHES)/UP_SCRYINC */
  132.  
  133. #define UP_XLAST (UP_XMAX - 1)
  134. #define UP_YLAST (UP_YMAX - 1)
  135.  
  136. /* These offsets center plot2ps output in the middle of the page.  The
  137.  * amount of resizing that can be done is limited. */
  138. /*
  139.  * #define UP_XOFF 6454
  140.  * #define UP_YOFF 10601
  141.  */
  142.  
  143. /* These offsets give a 1" offset from the lower left corner.  This
  144.  * gives a greater range of permissible values in GNUPLOT's size
  145.  * command. */
  146. #define UP_XOFF 3972
  147. #define UP_YOFF 3972
  148.  
  149. enum JUSTIFY up_justify = LEFT;
  150.  
  151. #ifdef GNU_PLOTUTILS
  152. # define ROTATE(angle) textangle(90*angle)
  153. #else
  154. # define ROTATE(angle) rotate(0,0,90*angle)
  155. #endif
  156.  
  157. #ifdef GNU_PLOTUTILS
  158. /* We don't include plot.h from plotutils because of
  159.  * the name clash with ../plot.h.
  160.  */
  161. extern int openpl __PROTO((void));
  162. extern int space __PROTO((int, int, int, int));
  163. extern int fontname __PROTO((const char *));
  164. extern int fontsize __PROTO((int));
  165. extern int erase __PROTO((void));
  166. extern int linemod __PROTO((const char *));
  167. extern int move __PROTO((int, int));
  168. extern int cont __PROTO((int, int));
  169. extern int alabel __PROTO((int, int, const char *));
  170. extern int textangle __PROTO((int));
  171. extern int closepl __PROTO((void));
  172. #endif
  173.  
  174. TERM_PUBLIC void UP_options()
  175. {
  176.     if (!END_OF_COMMAND) {
  177.     if (almost_equals(c_token, "d$efault")) {
  178.         strcpy(up_font, "Courier");
  179.         up_fontsize = 10;
  180.         term->v_char = (unsigned int) (up_fontsize * UP_VFONTSC);
  181.         term->h_char = (unsigned int) (up_fontsize * UP_HFONTSC);
  182.         c_token++;
  183.     }
  184.     }
  185.     if (!END_OF_COMMAND && isstring(c_token)) {
  186.     quote_str(up_font, c_token, MAX_ID_LEN);
  187.     c_token++;
  188.     }
  189.     if (!END_OF_COMMAND) {
  190.     /* We have font size specified */
  191.     struct value a;
  192.     up_fontsize = (int) real(const_express(&a));
  193.     term->v_char = (unsigned int) (up_fontsize * UP_VFONTSC);
  194.     term->h_char = (unsigned int) (up_fontsize * UP_HFONTSC);
  195.     }
  196.     sprintf(term_options, "\"%s\" %d", up_font, up_fontsize);
  197. }
  198.  
  199. TERM_PUBLIC void UP_init()
  200. {
  201.     openpl();
  202.     space(0, 0, UP_SCREENX - 1, UP_SCREENY - 1);
  203.     fontname(up_font);
  204. /*
  205. #ifdef GNU_PLOTUTILS
  206.     fontsize((int)((up_fontsize / 72.0 * 8.0) * (UP_SCREENY-1)));
  207. #else
  208. */
  209.     fontsize(up_fontsize);
  210. /*
  211. #endif
  212. */
  213. }
  214.  
  215.  
  216. TERM_PUBLIC void UP_graphics()
  217. {
  218.     erase();
  219. }
  220.  
  221.  
  222. TERM_PUBLIC void UP_text()
  223. {
  224.     /* Flush here so that output will be complete. */
  225.     fflush(stdout);
  226. }
  227.  
  228.  
  229. TERM_PUBLIC void UP_linetype(linetype)
  230. int linetype;
  231. {
  232.     static char *lt[2+5] = { "solid", "longdashed", "solid", "dotted",
  233.                  "shortdashed", "dotdashed", "longdashed"};
  234.  
  235.     if (linetype >= 5)
  236.     linetype %= 5;
  237.     linemod(lt[linetype + 2]);
  238. }
  239.  
  240.  
  241. TERM_PUBLIC void UP_move(x, y)
  242. unsigned int x, y;
  243. {
  244.     move(x + UP_XOFF, y + UP_YOFF);
  245. }
  246.  
  247.  
  248. TERM_PUBLIC void UP_vector(x, y)
  249. unsigned int x, y;
  250. {
  251.     cont(x + UP_XOFF, y + UP_YOFF);
  252. }
  253.  
  254.  
  255. TERM_PUBLIC void UP_put_text(x, y, str)
  256. unsigned int x, y;
  257. char str[];
  258. {
  259.     UP_move(x, y);        /* Don't adjust x and y! It's done in UP_move. */
  260.     switch (up_justify) {
  261.     case LEFT:
  262.     alabel('l', 'c', str);
  263.     break;
  264.     case CENTRE:
  265.     alabel('c', 'c', str);
  266.     break;
  267.     case RIGHT:
  268.     alabel('r', 'c', str);
  269.     break;
  270.     }
  271.  
  272. }
  273.  
  274. TERM_PUBLIC int UP_text_angle(ang)
  275. int ang;
  276. {
  277.     ROTATE(ang);
  278.     return TRUE;
  279. }
  280.  
  281. TERM_PUBLIC int UP_justify_text(mode)
  282. enum JUSTIFY mode;
  283. {
  284.     up_justify = mode;
  285.     return TRUE;
  286. }
  287.  
  288. TERM_PUBLIC void UP_reset()
  289. {
  290.     closepl();
  291. }
  292.  
  293. #endif /* TERM_BODY */
  294.  
  295. #ifdef TERM_TABLE
  296.  
  297. TERM_TABLE_START(unixplot_driver)
  298.     "unixplot", "GNU plot(1) format [\042fontname\042 font_size]",
  299.     UP_XMAX, UP_YMAX, UP_VCHAR, UP_HCHAR,
  300.     UP_VTIC, UP_HTIC, UP_options, UP_init, UP_reset,
  301.     UP_text, null_scale, UP_graphics, UP_move, UP_vector,
  302.     UP_linetype, UP_put_text, UP_text_angle,
  303.     UP_justify_text, line_and_point, do_arrow, set_font_null
  304. TERM_TABLE_END(unixplot_driver)
  305.  
  306. #undef LAST_TERM
  307. #define LAST_TERM unixplot_driver
  308.  
  309. #endif /* TERM_TABLE */
  310. #endif /* TERM_PROTO_ONLY */
  311.  
  312. #ifdef TERM_HELP
  313. START_HELP(unixplot)
  314. "1 unixplot",
  315. "?commands set terminal unixplot",
  316. "?set terminal unixplot",
  317. "?set term unixplot",
  318. "?terminal unixplot",
  319. "?term unixplot",
  320. "?unixplot",
  321. " The `unixplot` driver produces device-independent output in the GNU plot",
  322. " graphics language.  The default size of the PostScript results generated by",
  323. " \"plot2ps\" is 5 x 3 inches; this can be increased up to about 8.25 x 8.25 by",
  324. " `set size`.",
  325. "",
  326. " Syntax:",
  327. "       set terminal unixplot {\"<fontname>\"} {<fontsize>}",
  328. "",
  329. " which defaults to 10-point \"Courier\".",
  330. "",
  331. " There is a non-GNU version of the `unixplot` driver which cannot be compiled",
  332. " unless this version is left out."
  333. END_HELP(unixplot)
  334. #endif
  335.